package main

import (
	"fmt"
	"github.com/go-ole/go-ole"
	"github.com/go-ole/go-ole/oleutil"
	"log"
	"os"
	"path/filepath"
)

// target: 可执行文件或其他目标全路径
// args: 需要传给 target 的命令行参数（例如 "--config=config.json"）
func CreateDesktopShortcut(target, args string, icon string) (string, error) {
	// 1. 拿到桌面路径
	home, err := os.UserHomeDir()
	if err != nil {
		return "", fmt.Errorf("获取用户目录失败: %w", err)
	}
	desktop := filepath.Join(home, "Desktop")

	// 2. 快捷方式文件名，取 target 的文件名（不含扩展名）+ .lnk

	linkName := "医院应急程序.lnk"
	linkPath := filepath.Join(desktop, linkName)

	// 3. 初始化 COM
	if err := ole.CoInitialize(0); err != nil {
		return "", fmt.Errorf("CoInitialize 失败: %w", err)
	}
	defer ole.CoUninitialize()

	// 4. 创建 WScript.Shell 对象
	unknown, err := oleutil.CreateObject("WScript.Shell")
	if err != nil {
		return "", fmt.Errorf("CreateObject(WScript.Shell) 失败: %w", err)
	}
	defer unknown.Release()

	wshell, err := unknown.QueryInterface(ole.IID_IDispatch)
	if err != nil {
		return "", fmt.Errorf("QueryInterface IID_IDispatch 失败: %w", err)
	}
	defer wshell.Release()

	// 5. 调用 CreateShortcut 方法
	ret, err := oleutil.CallMethod(wshell, "CreateShortcut", linkPath)
	if err != nil {
		return "", fmt.Errorf("CreateShortcut 调用失败: %w", err)
	}
	shortcut := ret.ToIDispatch()
	defer shortcut.Release()

	// 6. 设置属性
	if _, err := oleutil.PutProperty(shortcut, "TargetPath", target); err != nil {
		return "", fmt.Errorf("设置 TargetPath 失败: %w", err)
	}
	if _, err := oleutil.PutProperty(shortcut, "Arguments", args); err != nil {
		return "", fmt.Errorf("设置 Arguments 失败: %w", err)
	}
	if _, err := oleutil.PutProperty(shortcut, "WorkingDirectory", filepath.Dir(target)); err != nil {
		return "", fmt.Errorf("设置 WorkingDirectory 失败: %w", err)
	}

	// **新增：设置图标**
	if icon != "" {
		if _, err = oleutil.PutProperty(shortcut, "IconLocation", icon); err != nil {
			return "", fmt.Errorf("设置 IconLocation 失败: %w", err)
		}
	}

	// 7. 保存 .lnk
	if _, err := oleutil.CallMethod(shortcut, "Save"); err != nil {
		return "", fmt.Errorf("保存快捷方式失败: %w", err)
	}
	log.Printf("创建桌面快捷方式成功: %s", linkName)

	return linkPath, nil
}
